#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void menu();
struct good *xuanze(struct good *head);
struct good *shuru(struct good *head);
void charu(struct good *head);
void shanchu(struct good *head);
void xiugai(struct good *head);
void chazhao(struct good *head);
void chucun(struct good *head);
void print_good(struct good * head);
void jiezhang(struct good *head);
void dakai_wenjian();
// 2018年修改
void cxy();
struct good//声明一个结构体
{
	long sno;
	char sname[20];
	float price;
	long number;
	long barcode; 
	struct good *next;
 };
 int main()//主函数
 {
 	struct good *head=NULL;
 	printf("\t\t\t\t——————————————————————\n");
 	printf("\t\t\t\t         结账系统为您服务！              \n");
	printf("\t\t\t\t--------------------------------------------\n");
	while(1)
	{
		menu();
		head=xuanze(head);
	}
	return 0;
 }
 void menu()//菜单提示语句 
 {
 	printf("\n\t\t\t\t\t-------------------------------\n");
 	printf("\n\t\t\t\t\t    1.输入商品信息               ");
	printf("\n\t\t\t\t\t    2.插入商品信息               ");
	printf("\n\t\t\t\t\t    3.删除商品信息               ");
	printf("\n\t\t\t\t\t    4.修改商品信息               ");
	printf("\n\t\t\t\t\t    5.查找商品信息               ");
	printf("\n\t\t\t\t\t    6.储存商品信息到文件    ");
	printf("\n\t\t\t\t\t    7.显示商品信息    ");
	printf("\n\t\t\t\t\t    8.结账   "); 
	printf("\n\t\t\t\t\t    9.显示上次关闭时的信息"); 
	printf("\n\t\t\t\t\t    0.退出系统                   ");
	printf("\n\t\t\t\t\t    请输入相关选项               "); 
	printf("\n"); 
 }
 //功能选择，并且返回一个指针
 struct good *xuanze(struct good *head)
 {
    int  i;
    scanf("%d",&i);
    if(i>=0&&i<=9)
    {
    	switch(i)
    	{
    		case 1:head=shuru(head);break;
    		case 2:charu(head);break;
			case 3:shanchu(head);break;
			case 4:xiugai(head);break;
			case 5:chazhao(head);break;
			case 6:chucun(head);break;
			case 7:print_good(head);break;
			case 8:jiezhang(head);break;
			case 9:dakai_wenjian();break;
			case 0: printf("谢谢使用！");exit(0);
			default: printf("输入有误！");break;
		}
	}
	else
    {
       printf("输入有误!请输入数字！\n");	
	} 
	getchar();
	getchar();
	return head; 
} 
  //输入商品信息
    struct good *shuru(struct good *head)
  {
  	struct good *p1 = NULL,*p2 = NULL;
  	int n,i;
  	printf("请输入商品的种类数目：\n");
  	scanf("%d",&n);
  	fseek(stdin,0,SEEK_END);
  	p2=head=(struct good *)malloc(sizeof(struct good)); 
    p2->sno=0;
    p2->sname[0]='\0';
    p2->price=0.0;
    p2->number=0; 
    p2->barcode=0;
    head->next=p1; 
    p2=head;
    for(i=0;i<n;i++)
    {
    	p1=(struct good *)malloc(sizeof(struct good));
    	printf("请输入商品信息！\n");
    	printf(" 编号  名字  价格  数量  条形码\n");
		int namesize = sizeof(p1->sname) / sizeof(p1->sname[0]);
    	scanf("%ld %s %f %ld %ld",&p1->sno,p1->sname, namesize,&p1->price,&p1->number,&p1->barcode);
		//scanf("%s", p1->sname);
	    p2->next=p1; 
		p2=p1; 
	}
	p1->next=NULL;
	printf("输入成功！\n");
	return head;
   } 
   //插入商品信息(按编号插入)
 void charu_sno(struct good *head)
 {
 	struct good *p1,*p2;
	 long  x;
 	p1=p2=head->next;
 	printf("请输入要插入商品的编号\n：");
 	scanf("%ld",&x);
 	while(p2 != NULL)
 	{
 		if(p2->sno==x)
	 	{
			struct  good *p=(struct good*)malloc(sizeof (struct good));
	    	p->next=NULL;
 			printf("请输入插入的商品信息！\n");
    		printf(" 编号  名字  价格  数量  条形码\n");
    		scanf("%ld %20s %f %ld %ld",&p->sno,p->sname,&p->price,&p->number,&p->barcode);
			p1 = p2;
			p2 = p2->next;
 			printf("插入成功！");
 			break;
	   }
 		p1=p2;
    	p2=p2->next;
    	if(p2==NULL)
		printf("没有该编号的商品:\n"); 
 	}
 }
//插入商品信息(按名字插入)
void charu_sname(struct good *head)
 {
 	struct good *p1,*p2;
	 char a[20];
 	p1=p2=head->next;
 	printf("请输入要插入商品的名称\n：");
 	scanf("%s",a);
 	while(p2 != NULL)
 	{
 		if(strcmp(p2->sname,a)==0)
	 	{
			struct good *p=(struct good *)malloc(sizeof(struct good));
	    	p->next=NULL;
 			printf("请输入插入的商品信息！\n");
    		printf(" 编号  名字  价格  数量  条形码\n");
    		scanf("%ld %20s %f %ld %ld",&p->sno,p->sname,&p->price,&p->number,&p->barcode);
 			p1->next=p;
 			p->next=p2;
 			printf("插入成功！");
 			break;
	   }
 		p1=p2;
    	p2=p2->next;
    		if(p2==NULL)
		printf("没有该名称的商品:\n"); 
 	}
 }
 //插入商品信息（总函数）
 void charu(struct good *head)
 {
 	int z;
	 struct good *p=head;
	 while(1)
	 {
	 	printf("请选择插入方式！\n");
		printf("1.按照编码插入！\n");
		printf("2.按照名字插入！\n");
		printf("请选择：\n");
		scanf("%d",&z);
		switch(z)
		{
			case 1:charu_sno(head);break;
			case 2:charu_sname(head);break;
			default :printf("没有该插入法\n");
		 }
		 break;
	  }
  }
  //按照编码删除数据信息（分函数）
void shanchu_sno(struct good *head)
{
	int n,e=0;
	struct good *p1,*p2;
	p1=head->next;
	p2=head;
	printf("请输入要删除的节点的编号：\n");
	scanf("%d",&n);
	if(p1==NULL)
	{
		printf("该链表为空！\n");
		return  ;
	}
	while(p1!=NULL)
	{
		if(p1->sno==n)
		{
			p2->next=p1->next;
			free(p1);
			p1=NULL;
			break;
		}
		else
		  {
		  	p2=p1;
		  	p1=p1->next;
		  }
		if(p1==NULL)
		  {
		  	printf("未找到相关节点！\n");
		  	e=1;
		   }

	}
	if(e!=1)
    {
	   printf("已经将该节点删除！\n");
	}
}
//按照名字删除数据信息（分函数）
void shanchu_sname(struct good *head)
{
 	int e=0;
 	char  i[20];
 	struct good *p1,*p2;
 		p1=head->next;
	p2=head;
	printf("请输入要删除的节点的名字：\n");
	scanf("%s",i);
	if(p1==NULL)
	{
		printf("该链表为空！\n");
		return  ;
	}
	while(p1!=NULL)
	{
		if(strcmp(p1->sname,i)==0)
		{
			p2->next=p1->next;
			free(p1);
			p1=NULL;
			break;
		}
		else
		  {
		  	p2=p1;
		  	p1=p1->next;
		  }
		if(p1==NULL)
		  {
		  	printf("未找到相关节点！\n");
		  	e=1;
		   }

	}
	if(e!=1)
    {
	   printf("已经将该节点删除！\n");
	}
 }
//删除数据信息（总函数）
void shanchu(struct good *head)
{
	int z;
	struct good *p=head;
	while(1)
	{
		printf("请选择删除方式！\n");
		printf("1.按照编码删除！\n");
		printf("2.按照名字删除！\n");
		printf("请选择：\n");

		scanf("%d",&z);
		switch(z)
		{
			case 1:shanchu_sno(head);break;
			case 2:shanchu_sname(head);break;
			case 0:menu();xuanze(head);break;
			default:printf("输入错误！\n");
		}
		break;
	 }
 }

 //修改商品信息（按编码修改）
 void xiugai_sno(struct good *head)
 {
 	long n;
 	struct good *p;
	 p=head->next;
	int i=0;
	 if(p==NULL)
	 {
	 	printf("该链表为空！\n");
	 	return ;
	 }
	 printf("请输入更改商品的编码：\n");
	 scanf("%ld",&n);
	 while(p!=NULL)
	 {
	 	if(p->sno==n)
	 	{		
	 		i=1;
	 		printf("请输入更改后的商品信息：\n");
	 		scanf("%ld %20s %f %ld %ld",&p->sno,p->sname,&p->price,&p->number,&p->barcode);
	 		printf("更改成功！\n");
	 		break;
		 }
		 else
		 	p=p->next;

		 if(i!=1)
		 	printf("未找到该商品信息\n");
	 }
}
//修改商品信息（按名称修改）
void xiugai_sname(struct good *head)
 {
 	char n[20];
 	struct good *p;
	 p=head->next;
	 int i=0; 
	 if(p==NULL)
	 {
	 	printf("该链表为空！\n");
	 	return ;
	 }
	 printf("请输入更改节点的名称：\n");
	 scanf("%s",n);
	 while(p!=NULL)
	 {
	 	if(strcmp(p->sname,n)==0)
	 	{
	 		i=1;
	 		printf("请输入修改后的信息：\n");
	 		scanf("%ld %20s %f %ld %ld",&p->sno,p->sname,&p->price,&p->number,&p->barcode);
	 		printf("更改成功！\n");
	 		break;
		 }
		 else
		 	p=p->next;

		 if(i!=1)
		 	printf("未找到该商品信息\n");
	 }
}
//修改商品信息（总函数）
void xiugai(struct good *head)
{
	int z;
	struct good *p;
	p=head->next;

	if(p==NULL)
	{
		printf("链表为空！\n");
		return ;
	}
	else
	{
		printf("请选择更改商品信息的方式：\n");
 		printf("1.按照编码修改商品信息！\n");
 		printf("2.按照名字修改商品信息！\n");
 		printf("0.退出修改！\n");
 		printf("请选择：\n");
 		scanf("%d",&z);
 		switch(z)
 		{
 			case 1:xiugai_sno(head);break;
 			case 2:xiugai_sname(head);break;
 			case 0:menu();xuanze(head);break;
 			default:printf("输入错误！\n");
 		 }
	}
}
//查找商品信息(按编号查找）
void chazhao_sno(struct good *head)
{
	long n,e=0;
	struct good *p;
	p=head->next;
	if(p==NULL)
	{
		printf("该链表为空！\n");
		return  ;
	}
		printf("请输入要查找的商品的编号：\n");
			scanf("%ld",&n);
	while(p!=NULL)
	{
		if(p->sno==n)
		{
			printf("找到目标：\n");
			printf("编码：%ld,名字：%20s,价格: %f,数量: %ld,条形码: %ld",p->sno, p->sname,p->price,p->number,p->barcode);
			e=1;
			break;
		}
		else
		  {
		  	p=p->next;
		  }

	} 	if(e!=1)
		  {
		  	printf("查找失败!\n");
		  }
}
//查找商品信息（按名称查找）
void chazhao_sname(struct good *head)
{
	char n[20];
	long e=0;
	struct good *p;
	p=head->next;
	if(p==NULL)
	{
		printf("该链表为空！\n");
		return  ;
	}
		printf("请输入要查找的商品的名称：\n");
			scanf("%s",n);
	while(p!=NULL)
	{
		if(strcmp(p->sname,n)==0)
		{
			printf("找到目标：\n");
			printf("编码：%ld,名字：%20s,价格: %f,数量: %ld,条形码: %ld",p->sno, p->sname,p->price,p->number,p->barcode);
			e=1;
			break;
		}
		else
		  {
		  	p=p->next;
		  }

	} 
	if(e!=1)
		  {
		  	printf("查找失败！\n");
		  }
}
//查找商品信息（总函数）
void chazhao(struct good *head)
{
	int z;
	struct good *p;
	p=head->next;

	if(p==NULL)
	{
		printf("链表为空！\n");
		return ;
	}
	else
	{
		printf("请选查找商品信息的方式：\n");
 		printf("1.按照编码查找商品信息！\n");
 		printf("2.按照名字查找商品信息！\n");
 		printf("0.退出修改！\n");
 		printf("请选择：\n");
 		scanf("%d",&z);
 		switch(z)
 		{
 			case 1:chazhao_sno(head);break;
 			case 2:chazhao_sname(head);break;
 			case 0:menu();xuanze(head);break;
 			default:printf("输入错误！\n");
 		 }
	}
}
//显示所有存储的信息
void print_good(struct good *head)
{
	struct good *p;
	int n,i;
	p=head->next;
	if(p==NULL)
	{
		printf("你这个骗子，啥都没有\n");
		return ; 
	}
	while(1)
	{
		if(p!=NULL)
		{

			printf("请输入你想显示的商品信息的个数:\n"); 
			scanf("%d",&n);
			for(i=1;i<=n;i++)
			{
				printf("显示商品的信息\n"); 
				printf("编码：%ld,名字：%20s,价格: %f,数量: %ld,条形码: %ld\n",p->sno, p->sname,p->price,p->number,p->barcode);
				p=p->next;
				if(p==NULL)
				{
					break;
				}
			}	
			return ;	 
		}	
		break;	 
	}
	 
}
//显示上次关闭时的信息 
void dakai_wenjian()
{
	char ch;
	FILE *fp;
	if((fp=fopen("c","r"))==NULL)
	{
		printf("cannot open this file!\n");
		exit(0);
	 }
	   while((ch=fgetc(fp))!=EOF)
	   {
         putchar(ch);
       }
	 fclose(fp);
}

//将信息存储到文件中去
 void chucun(struct good *head)
 {
 	struct good *p;
 	p=head->next;
		
 	FILE *fp;
 	if((fp=fopen("file6.txt","a"))==NULL)
 	{
 		printf("文件打开失败！\n");
 		exit(0);
	 }
	 if(p==NULL)
	 {
	 	printf("链表为空！\n");
	 	return ;
	 }
	 while(p!=NULL)
	 {
	 	fprintf(fp,"编码：%ld 名字：%20s 价格：%f 数量：%ld 条形码：%ld",p->sno,p->sname,p->price,p->number,p->barcode);
	 	fputs("\n",fp);
	 	p=p->next;
	 }
	 fclose(fp);
	 printf("信息储存成功！\n");
}

void jiezhang(struct good *head)
{
	float z,a;
	int m,n,j,h;
	printf("请输入购买的个数\n");
	scanf("%d",&m);
	float all_price=0;
	struct good *p;
	for(j=0;j<m;j++)
	{
		p=head->next;
		printf("请输入购买的商品编号  请输入购买的商品数量\n"); 
		scanf("%d %d",&n,&h);
		while(p!=NULL)
		{		
			if(p->sno==n)
			{
				if(p->number>=h)
				{
					all_price=p->price*h+all_price;
					p->number=p->number-h;
				}
				if(p->number<h)
				{
					all_price=p->price*p->number+all_price;
				
					p->number=0;
				}
			
			}
			p=p->next;
		}
	}
		printf("抱歉，小店货源不足，不好意思\n");
			printf("总价格：%f\n",all_price);
			printf("请输入收顾客多少monoy!\n");
			scanf("%f",&z);
			if(z>=all_price)
			{
				printf("找零%f元\n",z-all_price);
			}
			else
			{
				printf("钱不够请加钱:\n");
				printf("请输入加多少钱:\n");
				scanf("%f",&a);
				printf("%f\n",z+a-all_price);
			}
			printf("欢迎下次光临"); 
}
